#ifndef EVENTO_GERENCIADOR_H
#define EVENTO_GERENCIADOR_H

#include "tarefa/tarefa.h"
#include "util/singleton.h"
#include "evento/enum_eventos.h"

#include <map>
#include <queue>

using namespace std;

#define GE ::evento::gerenciador::getInstancia()
#define LANCA(x) GE.lanca_evento(x)

namespace evento {

class evento;
class tratador;

typedef std::multimap<en_evento, tratador*>::iterator iterator;
/**
  * \brief Gerenciador de Eventos
  *
  * Quando um evento ocorre, chama o tratador deste evento.
  *
  * @author Daniel Fleischman
  * @date 29/01/2008
  */
class gerenciador : public tarefa::tarefa {
  SINGLETON(gerenciador);
  public:
  virtual ~gerenciador();
  /**
    * Associa um evento a um tratador
    * @param tipo o evento que esta sendo cadastrado.
    * @param trat o tratador do evento
    * @return se a insercao foi bem sucedida ou nao.
    */
  iterator cadastra(en_evento tipo, tratador* trat);
  /**
      * Executa. Eh quando o gerenciador verifica se um evento ocorreu.
    */
  bool executa(int passou);
  iterator get(en_evento tipo);
  void remove(iterator it);
  void lanca_evento(evento* event);
  private:
  multimap<en_evento, tratador*> mapa_;
  queue<evento*> fila_;
};

}

#endif
